/**
 * 数据库导入脚本
 * 用于初始化数据库并导入参赛学生名单
 */

import mysql from 'mysql2/promise';
import fs from 'fs';
import path from 'path';
import { parse } from 'csv-parse';
import { fileURLToPath } from 'url';

// 获取当前文件的目录路径
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 数据库连接配置
const dbConfig = {
  user: 'root',         // 默认用户名，根据实际情况修改
  host: 'localhost',    // 数据库主机
  database: 'mofang',   // 数据库名称
  password: 'Lizhiyuan101!',     // 默认密码，根据实际情况修改
  port: 3306,          // MySQL默认端口
};

// 文件路径
const integratedDbSqlPath = path.join(__dirname, 'integrated_database.sql');
const importStudentsSqlPath = path.join(__dirname, 'import_students.sql');
const csvFilePath = path.join(__dirname, '副本参赛学生名单A1.csv');

// 创建数据库连接
let connection;

/**
 * 执行SQL文件
 * @param {string} filePath SQL文件路径
 */
async function executeSqlFile(filePath) {
  console.log(`执行SQL文件: ${filePath}`);
  const sql = fs.readFileSync(filePath, 'utf8');
  
  // 移除注释和COMMENT ON语句
  const cleanedSql = sql
    .replace(/--.*$/gm, '') // 移除单行注释
    .replace(/\/\*[\s\S]*?\*\//g, '') // 移除多行注释
    .replace(/COMMENT\s+ON\s+(?:TABLE|COLUMN)\s+[^;]+;/g, '') // 移除COMMENT ON语句
    .replace(/EXECUTE\s+FUNCTION\s+[^(]+\(\)/g, 'BEGIN SET NEW.updated_at = CURRENT_TIMESTAMP; END') // 将PostgreSQL触发器语法转换为MySQL语法
    .trim();

  // 处理触发器语句
  const triggerStatements = [];
  const normalStatements = [];
  let isInTrigger = false;
  let currentTrigger = '';
  let currentStatement = '';

  // 按行分割SQL
  const lines = cleanedSql.split('\n');
  for (let line of lines) {
    line = line.trim();
    if (!line) continue;

    if (line.toUpperCase().startsWith('DELIMITER')) {
      if (line.includes('//')) {
        isInTrigger = true;
        if (currentStatement.trim()) {
          normalStatements.push(currentStatement.trim());
          currentStatement = '';
        }
      } else {
        if (currentTrigger) {
          triggerStatements.push(currentTrigger.trim());
          currentTrigger = '';
        }
        isInTrigger = false;
      }
      continue;
    }

    if (isInTrigger) {
      currentTrigger += ' ' + line;
    } else {
      currentStatement += ' ' + line;
      if (line.endsWith(';')) {
        normalStatements.push(currentStatement.trim());
        currentStatement = '';
      }
    }
  }

  // 如果还有未处理的触发器，添加到触发器语句列表
  if (currentTrigger) {
    triggerStatements.push(currentTrigger.trim());
  }

  // 先执行普通语句
  for (const statement of normalStatements) {
    if (!statement.trim()) continue;
    try {
      // 对于触发器创建语句使用query方法，其他语句使用execute方法
      if (statement.toUpperCase().includes('CREATE TRIGGER')) {
        await connection.query(statement);
      } else {
        await connection.execute(statement);
      }
    } catch (error) {
      console.error('执行SQL语句时出错:', error);
      console.error('问题SQL语句:', statement);
      throw error;
    }
  }

  // 再执行触发器语句
  for (const trigger of triggerStatements) {
    if (!trigger.trim()) continue;
    try {
      await connection.query(trigger);
    } catch (error) {
      console.error('执行触发器语句时出错:', error);
      console.error('问题触发器语句:', trigger);
      throw error;
    }
  }
  
  console.log(`SQL文件执行完成: ${filePath}`);
}

/**
 * 导入CSV数据到临时表
 */
async function importCsvToTempTable() {
  console.log(`导入CSV文件: ${csvFilePath}`);
  
  // 检查并删除已存在的临时表
  try {
    await connection.execute('DROP TEMPORARY TABLE IF EXISTS temp_students');
  } catch (error) {
    console.log('临时表不存在，无需删除');
  }
  
  // 创建临时表
  await connection.execute(`
    CREATE TEMPORARY TABLE temp_students (
      序号 INTEGER,
      学校 VARCHAR(100),
      校内序号 INTEGER,
      组别 VARCHAR(20),
      姓名 VARCHAR(50),
      班级 VARCHAR(50),
      身份证号 VARCHAR(50),
      性别 VARCHAR(10),
      是否替补 VARCHAR(10)
    ) ENGINE=MEMORY;
  `);
  
  // 读取CSV文件
  const csvContent = fs.readFileSync(csvFilePath, 'utf8');
  
  // 解析CSV数据
  const records = await new Promise((resolve, reject) => {
    parse(csvContent, {
      columns: true,
      skip_empty_lines: true
    }, (err, records) => {
      if (err) reject(err);
      else resolve(records);
    });
  });
  
  console.log(`CSV文件解析完成，共 ${records.length} 条记录`);
  
  // 将数据插入临时表
  for (const record of records) {
    const values = [
      record.序号 ? parseInt(record.序号) : null,
      record.学校 || null,
      record.校内序号 ? parseInt(record.校内序号) : null,
      record.组别 || null,
      record.姓名 || null,
      record.班级 || null,
      record.身份证号 || null,
      record.性别 || null,
      record.是否替补 || null
    ];
    
    await connection.execute(
      `INSERT INTO temp_students (序号, 学校, 校内序号, 组别, 姓名, 班级, 身份证号, 性别, 是否替补) 
       VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
      values
    );
  }
  
  console.log('CSV数据导入临时表完成');
}

/**
 * 主函数
 */
async function main() {
  try {
    console.log('开始连接数据库...');
    connection = await mysql.createConnection(dbConfig);
    console.log('数据库连接成功');
    
    // 执行数据库初始化脚本
    await executeSqlFile(integratedDbSqlPath);
    
    // 导入CSV数据到临时表
    await importCsvToTempTable();
    
    // 执行学生导入脚本
    await executeSqlFile(importStudentsSqlPath);
    
    console.log('数据导入完成！');
  } catch (error) {
    console.error('发生错误:', error);
  } finally {
    if (connection) {
      await connection.end();
      console.log('数据库连接已关闭');
    }
  }
}

// 执行主函数
main();